package com.cskaoyan._07initialization._01basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/9 11:38
 **/
/*
1. 创建一个Person类，有name属性和eat方法
2. 创建一个Star类，有stageName属性和sing方法
3. Star类要继承Person类
4. 创建Star类对象，画出这个过程的内存图，描述子类对象初始化的过程

测试执行流程
1.创建Star对象,创建之前触发Star类加载,触发Star类加载之前又触发其父类Person类加载
2.父子类都加载完毕
3.创建对象的过程:
    父类中有成员变量
    子类中有成员变量
    是先赋值父类还是先赋值子类?
        --->先父类的成员进行赋值
    赋值的方式:
        1.默认赋值
        2.显式赋值
        3.构造代码块赋值
        4.构造器赋值
    赋值的顺序
        先父类的成员进行默认赋值,显式赋值,构造器
        再子类的成员赋值,赋值顺序保持一致
    为什么父类的赋值先执行?
        父类的构造器是先执行的,
        原因: 在子类的构造器中有一个默认隐藏的语句super(),
        此时如果子类的构造器中没有this(实参),也没有super(),--->子类对象的隐式初始化
        显示初始化就是在子类的构造器中用代码把super显式的写出来
 */
public class Demo {
    public static void main(String[] args) {
        Star star = new Star();
        // 子类自身方法
        star.sing();
        star.eat();
        System.out.println(star.name);
        System.out.println(star.stageName);

    }
}

//创建一个Person类，有name属性和eat方法
class Person{
    // 静态代码块
    static {
        System.out.println("Person static block");
    }
    // 成员变量
    String name = "kun";

    // 成员方法
    public void eat() {
        System.out.println("吃饭饭");
    }

    public Person(String name) {
        this.name = name;
    }

    public Person() {
    }
}

//2. 创建一个Star类，有stageName属性和sing方法
class Star extends Person{
    // 静态代码块
    static {
        System.out.println("Star static block");
    }

    // 成员变量
    String stageName = "体育馆";

    // 成员方法
    public void sing() {
        System.out.println("鸡你太美!我喜欢打篮球");
    }

    public Star(String stageName) {
        this.stageName = stageName;
    }

    public Star() {
        // super();
    }
}